load("@fbcode_macros//build_defs:cpp_library.bzl", "cpp_library")
load("@fbcode_macros//build_defs:cpp_unittest.bzl", "cpp_unittest")
load("@fbcode_macros//build_defs:cython_library.bzl", "cython_library")
load("@fbcode_macros//build_defs:python_unittest.bzl", "python_unittest")

oncall("fbcode_entropy_wardens_folly")

python_unittest(
    # @autodeps-skip
    name = "futures",
    srcs = ["futures.py"],
    deps = [
        ":simple_bridge",
    ],
)

python_unittest(
    # @autodeps-skip
    name = "coro",
    srcs = ["coro.py"],
    deps = [
        ":simple_bridge_coro",
    ],
)

cython_library(
    name = "simple_bridge",
    srcs = ["simplebridge.pyx"],
    headers = ["simple.h"],
    cpp_deps = [
        "//folly/futures:core",
    ],
    deps = [
        "//folly/python:fibers",
        "//folly/python:futures",
    ],
)

cpp_library(
    name = "iobuf_test_utils",
    srcs = ["IOBufTestUtils.cpp"],
    headers = ["IOBufTestUtils.h"],
    deps = [
        "//folly/python:iobuf_lib",
    ],
    exported_deps = [
        "fbsource//third-party/python:python",  # Python.h
        "//folly/io:iobuf",
    ],
)

cython_library(
    name = "iobuf_helper",
    srcs = [
        "iobuf_helper.pyx",
    ],
    headers = ["iobuf_helper.pxd"],
    cpp_deps = [":iobuf_test_utils"],
    types = [
        "iobuf_helper.pyi",
    ],
    deps = [
        "//folly/python:iobuf",
    ],
)

python_unittest(
    name = "iobuf",
    srcs = [
        "iobuf.py",
    ],
    deps = [
        ":iobuf_helper",
        "//folly/python:iobuf",
    ],
)

cython_library(
    name = "simple_bridge_coro",
    srcs = ["simplebridgecoro.pyx"],
    headers = ["simplecoro.h"],
    cpp_deps = [
        "//folly/experimental/coro:baton",
        "//folly/experimental/coro:task",
        "//folly/futures:core",
        "//folly:cancellation_token",
    ],
    deps = [
        "//folly/python:coro",
    ],
)

cython_library(
    name = "simple_generator",
    srcs = ["simplegenerator.pyx"],
    headers = ["simplegenerator.h"],
    cpp_deps = [
        "//folly/experimental/coro:async_generator",
    ],
    deps = [
        "//folly/python:async_generator",
        "//folly/python:executor",
    ],
)

python_unittest(
    # @autodeps-skip
    name = "generator",
    srcs = ["generator.py"],
    deps = [
        ":simple_generator",
    ],
)

cpp_unittest(
    name = "AsyncGeneratorTest",
    srcs = [
        "AsyncGeneratorTest.cpp",
    ],
    deps = [
        "//folly/experimental/coro:blocking_wait",
        "//folly/experimental/coro:task",
        "//folly/portability:gtest",
        "//folly/python:async_generator_lib",
    ],
)

cpp_unittest(
    name = "ErrorTest",
    srcs = [
        "ErrorTest.cpp",
    ],
    deps = [
        "fbsource//third-party/python:python",
        "//folly:scope_guard",
        "//folly/portability:gtest",
        "//folly/python:error",
    ],
)

python_unittest(
    # @autodeps-skip
    name = "teardown",
    srcs = ["teardown.py"],
    deps = [
        ":simple_bridge",
        ":simple_bridge_coro",
    ],
)

python_unittest(
    # @autodeps-skip
    name = "test_set_executor",
    srcs = ["test_set_executor.py"],
    deps = [
        ":test_set_executor_cython",
    ],
)

cython_library(
    name = "test_set_executor_cython",
    srcs = ["test_set_executor_cython.pyx"],
    cpp_deps = [
        ":test_set_executor_cpplib",
    ],
    deps = [
        "//folly/python:executor",
    ],
)

cpp_library(
    name = "test_set_executor_cpplib",
    headers = ["test_set_executor.h"],
    modular_headers = False,
    exported_deps = [
        "//folly/python:asyncio_executor",
    ],
)
